# time、datetime模块日期时间处理
import time
from datetime import datetime, timedelta


# 使用 time 模块操作时间
def time_test():
    # 获取当前时间
    timestamp = time.time()                                                 # 返回当前时间的时间戳
    localtime = time.localtime()                                            # 格式化时间戳为本地的时间。 如果sec参数未输入，则以当前时间为转换标准。
    print(f'时间戳：{timestamp}')
    print(f'结构化时间：{localtime}')

    # 将时间转化成字符串
    print('输出人能看得懂的格式：', time.strftime('%Y/%m/%d %H:%M:%S'))
    # 接收以时间元组，并返回以可读字符串表示的当地时间，格式由参数 format 决定。
    print('也可以传结构化时间参数进去：', time.strftime('%Y/%m/%d %I:%M:%S %p', localtime))
    now = '2020-11-11 11:11:11'
    # 根据指定的格式把一个时间字符串解析为时间元组。
    print('字符串转结构化时间：', time.strptime(now, '%Y-%m-%d %H:%M:%S'))

    # time.struct_time -> tuple
    # 1，使用 内置函数 tuple() 创建
    print('结构化时间转为元组1：', tuple(localtime))
    # 2，struct_time 本身为 tuple 子类，也可以如下使用：
    print('结构化时间转为元组2：', localtime[:])

    # tuple -> time.struct_time
    tuple_time = (2020, 11, 6, 21, 59, 49, 4, 311, 0)
    print('使用struct_time的构造方法：', time.struct_time(tuple_time))

    # time.struct_time -> timestamp
    print('结构化时间转时间戳', time.mktime(localtime))

    # timestamp -> time.struct_time
    print('时间戳转结构化时间1：', time.localtime(timestamp))
    print('时间戳转结构化时间2：', time.gmtime(timestamp))


# 使用 datetime 模块操作时间
def datetime_test():
    # 获取当前时间
    # today()读取系统当前时间
    a = datetime.today()
    # now()读取当前时间，可以指定时区，不指定则为系统设置时区
    b = datetime.now()
    # utcnow()读取当前时间，为格林尼治标准时间，不随系统变化，比北京时间晚8小时
    c = datetime.utcnow()
    print(f'使用datetime获取当前时间：\n{a}\n{b}\n{c}')

    # datetime.datetime -> str（输出人能看得懂的格式）
    print('输出人能看得懂的格式：', a.strftime('%Y/%m/%d %H:%M:%S'))

    # str -> datetime.datetime（人能看懂的格式，转换为机器用的数据格式对象datetime.datetime）
    d_time = datetime.strptime('2011/11/11 11:11:11', '%Y/%m/%d %H:%M:%S')
    print('字符串转datetime：', type(d_time), d_time)

    # datetime.datetime -> tuple
    # 需要先使用 timetuple() 方法将 datetime 对象转为 struct_time 对象
    print('datetime转为tuple：', tuple(a.timetuple()))

    # tuple -> datetime.datetime
    # 使用 datetime 的构造方法即可，注意参数：
    # datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])
    tuple_time = (2020, 11, 11, 11, 11, 11)
    print('tuple转datetime：', datetime(*tuple_time))

    # datetime.datetime -> timestamp
    print('datetime获取时间戳：', a.timestamp())

    # timestamp -> datetime.datetime
    print('时间戳转datetime：', datetime.fromtimestamp(time.time()))

    # datetime时间计算
    delta = timedelta(days=25, hours=-2)
    new_time = a + delta
    print('时间运算：', new_time)


def get_date(days):
    now = datetime.now()                            # 现在时间
    aDay = timedelta(days=days)                     # 基于输入参数，将时间增量赋值给aDay
    now = now + aDay                                # 现在与时间变量求和
    return now.strftime('%Y-%m-%d')                 # 返回求和后时间


if __name__ == '__main__':
    time_test()
    print()
    datetime_test()
    # 封装一个函数get_date(days) , 通过传入的数值days(days=1[-2,3,4,5]), 返回格式化后的时间
    print(get_date(-30))
